package a10_动态规划;

/**
 * <p>
 * a30_打家劫舍2
 * </p>
 *
 * @author flyduck
 * @since 2025/2/19
 */
public class a30_打家劫舍2 {
    //首尾要么选一个，要么都不选
    //情况1：两个都不考虑
    //情况2：考虑首元素
    //情况3：考虑尾元素

    //情况2考虑的范围包含情况1
    //情况3考虑的范围包含情况1

    //那么只需要考虑情况2和情况3就行了
    //Math.max(rob(情况2),rob(情况3))
    public int rob(int[] nums) {
        if(nums.length == 1){
            return nums[0];
        }
        return Math.max(rob1(splitArray(nums, 0, nums.length-2)),rob1(splitArray(nums, 1, nums.length-1)));
    }

    private int[] splitArray(int[] nums,int leftIdx,int rightIdx){
        int[] result = new int[rightIdx-leftIdx+1];
        int currentIdx = 0;
        while (leftIdx <= rightIdx){
            result[currentIdx] = nums[leftIdx];
            leftIdx++;
            currentIdx++;
        }
        return result;
    }

    //打家劫舍2用到了打家劫舍1
    private int rob1(int[] nums){
        if(nums.length == 1){
            return nums[0];
        }
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0],nums[1]);

        for (int i = 2; i < nums.length; i++) {
            dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i]);
        }
        return dp[dp.length-1];
    }
}
